home *** CD-ROM | disk | FTP | other *** search
/ Underground / Underground CD1.iso / virii / zrodla / t / timer.asm < prev    next >
Encoding:
Assembly Source File  |  1998-01-14  |  3.1 KB  |  141 lines

  1. PAGE ,132
  2.  
  3.     title    \asm_sour\timer.asm  HIGH ACCURACY TIMER
  4.  
  5.     subttl    michael e. walraven
  6.  
  7. .MODEL MEDIUM
  8.  
  9.  
  10.  
  11. name timer
  12.  
  13. .cref
  14.  
  15. .lall
  16.  
  17.  
  18.  
  19. ;
  20.  
  21. ;    High resolution timer, returns a 32 bit high resolution
  22.  
  23. ;    value which is the amount of elapsed time since the function
  24.  
  25. ;    was last called.  The counts are 838.2ns each (1.19318 MHz)
  26.  
  27. ;    time_int() must be called first to set the timer chip to
  28.  
  29. ;    the proper mode.
  30.  
  31. ;    Counter 0 is changed in time_int() and the data from this
  32.  
  33. ;    counter is used in elaptime() so it must not be changed
  34.  
  35. ;    between calls.
  36.  
  37. ;    There should not be any interference in system timing 
  38.  
  39. ;    max of 55 msec error introduced by time_int() into absolute
  40.  
  41. ;    system time.
  42.  
  43.  
  44.  
  45. ;    MEDIUM memory model/microsoft 5.00
  46.  
  47. ;    FAR PROGRAM, NEAR DATA
  48.  
  49. ;    cs: is code segment
  50.  
  51. ;    es: and ds: are data segment
  52.  
  53. ;    ss: within data segment
  54.  
  55. ;    ax: for integer return
  56.  
  57. ;    dx:ax: for long return
  58.  
  59.  
  60.  
  61. .DATA
  62.  
  63. ;    these data items located in the DSEG and can be accessed
  64.  
  65. ;    as near by C programs
  66.  
  67.  
  68.  
  69.     PUBLIC    SYS_HI
  70.  
  71.     PUBLIC    SYS_LOW
  72.  
  73.     PUBLIC    TIMER_COUNT
  74.  
  75.  
  76.  
  77. SYS_HI        DW    ?    ;TIMER_HI VALUE FOR PREVIOUS CALL
  78.  
  79. SYS_LOW        DW    ?    ;TIMER_LOW VALUE FOR PREVIOUS CALL
  80.  
  81. TIMER_COUNT    DW    ?    ;8253 TIMER COUNT FOR PREVIOUS CALL
  82.  
  83.  
  84.  
  85.  
  86.  
  87. ;    NO ARGUMENTS PASSED to either function
  88.  
  89.  
  90.  
  91. TIMER_MODE    EQU    043H
  92.  
  93. TIMER0        EQU    040H
  94.  
  95.  
  96.  
  97. BIOS    SEGMENT    AT 040H
  98.  
  99.     ORG    06CH
  100.  
  101. TIMER_LOW    DW    ?
  102.  
  103. TIMER_HI    DW    ?
  104.  
  105. BIOS    ENDS
  106.  
  107.  
  108.  
  109. PAGE
  110.  
  111. .CODE
  112.  
  113.  
  114.  
  115.     PUBLIC    _time_int
  116.  
  117. _time_int    PROC
  118.  
  119.  
  120.  
  121. ;    void far time_int(void);
  122.  
  123. ;
  124.  
  125. ;    SET THE TIMER MODE FOR PULSE OUTPUT, RATHER THAN SQUARE
  126.  
  127. ;        MODE AS SET BY DOS
  128.  
  129.  
  130.  
  131.     MOV    AL,00110100B    ;CTR 0, LSB THEN MSB
  132.  
  133.                 ;MODE 2, BINARY
  134.  
  135.     OUT    TIMER_MODE,AL    ;MODE REGISTER FOR 8253
  136.  
  137.     SUB    AX,AX        ;SET 0, RESULT IN MAX COUNT
  138.  
  139.     OUT    TIMER0,AL
  140.  
  141.     OUT    TIMER0,AL
  142.  
  143.     RET
  144.  
  145. _time_int    ENDP
  146.  
  147.  
  148.  
  149.  
  150.  
  151.     PUBLIC    _elaptime
  152.  
  153. _elaptime    PROC
  154.  
  155.  
  156.  
  157. ;    long int far elaptime(void);
  158.  
  159. ;
  160.  
  161. ;    DETERMINE ELAPSED TIME SINCE LAST CALL
  162.  
  163. ;    RETURNS 32 BIT (LONG) VALUE WHICH IS
  164.  
  165. ;    NEW  - TIMER_HI:TIMER_LO:TIMER_COUNT   MINUS
  166.  
  167. ;    OLD  - TIMER_HI:TIMER_LO:TIMER_COUNT
  168.  
  169.  
  170.  
  171. ;    ASSUMPTION MADE THAT 32 BITS WILL NOT OVERFLOW!!!!
  172.  
  173.  
  174.  
  175.     PUSH    ES
  176.  
  177.     MOV    AX,BIOS
  178.  
  179.     MOV    ES,AX
  180.  
  181.     ASSUME    ES:BIOS
  182.  
  183.  
  184.  
  185.     MOV    AL,0        ;PREPARE TO LATCH COUNTER
  186.  
  187.     OUT    TIMER_MODE,AL    ;LATCH 8253
  188.  
  189.  
  190.  
  191.     PUSHF        ;SAVE INTERRUPT STATE
  192.  
  193.     CLI        ;TURN INTERRUPT OFF WHILE READING CODE
  194.  
  195.     IN    AL,TIMER0
  196.  
  197.     MOV    DL,AL
  198.  
  199.     IN    AL,TIMER0
  200.  
  201.     MOV    DH,AL        ;DX HAS NEW CHIP COUNT(count down value)
  202.  
  203.  
  204.  
  205.     MOV    BX,ES:TIMER_LOW    ;BX HAS SYSTEM TIME LOW WORD
  206.  
  207.     MOV    AX,ES:TIMER_HI    ;AX HAS SYSTEM TIME HIGH WORD
  208.  
  209.  
  210.  
  211. ;    NOW HAVE A 48 BIT WORD AX:BX:DX FOR THE PRESENT TIME
  212.  
  213.     MOV    CX,TIMER_COUNT    ;SWAP AND SUBTRACT
  214.  
  215.     MOV    TIMER_COUNT,DX
  216.  
  217.     SUB    CX,DX
  218.  
  219.  
  220.  
  221. ;    CX: HAS LOW 16 BITS OF DIFFERENCE
  222.  
  223.  
  224.  
  225.     MOV    DX,SYS_LOW    ;SWAP AND SUBTRACT
  226.  
  227.     MOV    SYS_LOW,BX
  228.  
  229.     SBB    BX,DX
  230.  
  231.  
  232.  
  233. ;    BX: HAS MID 16 BITS OF DIFFERENCE
  234.  
  235.  
  236.  
  237.     MOV    DX,SYS_HI    ;SWAP AND SUBTRACT
  238.  
  239.     MOV    SYS_HI,AX
  240.  
  241.     SBB    AX,DX
  242.  
  243.  
  244.  
  245. ;    AX: HAS HIGH 16 BITS OF DIFFERENCE
  246.  
  247.  
  248.  
  249. ;    NOW HAVE A 48 BIT WORD THAT IS DIFFERENCE
  250.  
  251. ;    ONLY PASS BACK 32 BITS AT PRESENT
  252.  
  253. ;    AS DX:AX
  254.  
  255.  
  256.  
  257.     MOV    AX,CX    ;LOW 16 BITS
  258.  
  259.     MOV    DX,BX    ;MID 16 BITS
  260.  
  261.  
  262.  
  263.  
  264.  
  265.     POPF
  266.  
  267.     POP    ES
  268.  
  269.     RET
  270.  
  271. _elaptime    ENDP
  272.  
  273.  
  274.  
  275.  
  276.  
  277.     END
  278.  
  279.         
  280.  
  281.